要做什麼事情,總是要有個說服人的原因,不然我好好的開發幹嘛還要花時間在看不到功能的測試呢?
確保程式碼正確,防止無預期的錯誤:像是改了 A 功能壞 B 功能。
方便重構程式碼:測試能確保重構後的功能依然是正確的。
交接容易:新人進入專案,能快速了解功能,且較不容易改壞原本的功能。
我覺得光是以上三點,就足夠讓我們寫測試了,以長久來看,如果不是那種短期的活動網站,寫測試絕對能夠省下很多時間。
那一直在說要寫測試,到底要寫哪些測試呢?
測試的種類有分三種,單元測試、整合測試以及端對端測試。
單元測試 (Unit Test):針對程式中的最小單元進行測試,例如:函式、類別。
整合測試 (Integration Test):針對多個組件或模組之間的互動和整合測試,例如:使用者點擊按鈕跳出彈跳視窗。
端對端測試 (End-to-End Test):模擬真實使用者情境,測試整個應用程式的功能和流程,例如:使用者登入、使用者註冊。
根據上面的測試種類,就形成了一個測試金字塔的概念,就像下面那張圖:
金字塔越靠近頂端(E2E 測試),所耗費的成本越高,但是越貼近使用者,像是很多公司會使用人力測試,撰寫測試報告等等,雖然很耗費時間成本,但是最符合實際使用者操作的情況。
相反的,金字塔越靠近底部(單元測試),所耗費的成本越低,在開發的時候就可以進行,且如果單元測試做的夠好,也可以避免整合測試及端對端測試可能發生的錯誤。
所以在開發的時候,我們會希望能夠盡量多做單元測試,但是這並不代表我們不需要做整合測試及端對端測試,而是如果單元測試做的夠多夠好,就可以減少在做整合測試及端對端測試的人力及時間成本。
第一次學測試的時候,很難理解單元測試跟整合測試的差別,其實可以把整合測試想成是多個單元測試的組合,所以就算單元測試是正確的,也不能保證組合起來是正確的。
下面這張圖,可以很快速的理解他們之間的差別。
圖片來源:Unit_vs_integration_tests GIF